Шаг 393 - Переполнение типа int.

С вещественными типами вроде как все нормально. Ставим обработку ошибок переполнения и все в норме. А вот с int не удается сделать обработку. Упорно VC не видит переполнения. Хотя если посмотреть в отладчике то флаг переполнения успешно выставляется.

393_1.gif (8570 b)

Значит выход пока только один использовать ассемблер. Во первых для проверки нам нужно узнать максимальный размер int. Смотрим limits.h

#define INT_MIN     (-2147483647 - 1) 	/* minimum (signed) int value */
#define INT_MAX       2147483647    	/* maximum (signed) int value */

Так, создаем программу Win32 Console.

#include "stdafx.h"
#include "iostream.h"


void main()
{


	int i=2147483647;		// максимальное значение
	int g=1;			// вторая часть сложения
	int k=0;			// флаг переполнения
}

Ну а теперь код сложения пишем на ассемблере.

#include "stdafx.h"
#include "iostream.h"


void main()
{


	int i=2147483647;		// максимальное значение
	int g=1;			// вторая часть сложения
	int k=0;			// флаг переполнения
	

	_asm
	{
    	pushf			// сохраняем флаги
    	push ecx		// сохраняем регистр который будем использовать
	mov         ecx,dword ptr [i]	// из переменной в регистр
	add         ecx,dword ptr [g]	// складываем
	mov         dword ptr [i],ecx	// результат назад
	jo  overflow					// переход по переполнению
		jmp endover;				// небыло переполнения
	overflow:					// переполнение 
		mov         dword ptr [k],1		// установим флаг
	endover:							
	pop ecx							// восстановить регистр
	popf							// восстановить флаги
	}

	if (k==1) cout << "Overflow " << endl;
	else  cout << "OK" << endl;
}

Вот сейчас должно быть переполнение, так как мы выходим за границу int.

393_2.gif (2269 b)

А теперь попробуем уменьшить числа, что бы убедиться что переполнения нет.

int i=2147483646;	// максимальное значение

А все остальное так же. Запускаем.

393_3.gif (2235 b)

Вроде как сработало. А на другую границу ?

	int i=-2147483647 ;		// максимальное значение
	int g=-2;			// вторая часть сложения

Запускайте, сработает.

Hosted by uCoz